/**
 * 
 */
package com.cancer.common.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 集合工具类
 * 
 * @company GeekPlus
 * @project beetle
 * @author 刘俊
 * @date 2016年11月25日
 * @since 1.0.0
 */
public final class CollectionUtil {
	private CollectionUtil() {}
	
	/**
	 * 判断集合是否为null或空集
	 * 
	 * @author 刘俊 2016年11月25日
	 * @param coll
	 * @return
	 */
	public static boolean isEmpty(Collection<?> coll) {
		
		return coll == null || coll.size() == 0;
	}
	
	/**
	 * 判断集合是否存在元素
	 * 
	 * @author 刘俊 2016年11月25日
	 * @param coll
	 * @return
	 */
	public static boolean isNotEmpty(Collection<?> coll) {
		
		return !isEmpty(coll);
	}
	
	/**
	 * 判断Map是否为null或空集
	 * 
	 * @author 刘俊 2016年11月25日
	 * @param coll
	 * @return
	 */
	public static boolean isEmpty(Map<?, ?> map) {
		
		return map == null || map.size() == 0;
	}
	
	/**
	 * 判断Map是否存在元素
	 * 
	 * @author 刘俊 2016年11月25日
	 * @param coll
	 * @return
	 */
	public static boolean isNotEmpty(Map<?, ?> map) {
		
		return !isEmpty(map);
	}
	
	public static <R> List<R> toList(Collection<R> coll) {
		
		return coll.stream().collect(Collectors.toList());
	}
	
	public static <T, R> List<R> toList(Collection<T> coll, Function<T, R> map) {
		
		return coll.stream().map(map).collect(Collectors.toList());
	}
	
	/**
	 * 深复制一个list（通过序列化的方式）
	 * @param src
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	@SuppressWarnings("unchecked")  
	public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {  
	    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
	    ObjectOutputStream out = new ObjectOutputStream(byteOut);  
	    out.writeObject(src);  
	  
	    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
	    ObjectInputStream in = new ObjectInputStream(byteIn);  
	    List<T> dest = (List<T>) in.readObject();  
	    return dest;  
	}  
}
